/*********************************************************************************************************
**
**                                   GJB 标准测试集
**
**                               Copyright All Rights Reserved
**
**--------------文件信息--------------------------------------------------------------------------------
**
** 文   件   名: gjb_S0101804GN_3.c
**
** 文件创建日期: 2021 年 1 月 12 日
**
** 描        述: 协议栈信息统计功能测试。编制测试用例代码，调用恰当
**               接口函数获取协议栈统计信息
**
**               routes。
*********************************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <ifaddrs.h>
#include <netdb.h>

#include <sys/types.h>
#include <unistd.h>
#include <string.h>


int main(int argc, char **argv)
{
    printf("display routes information:\n");
    // routes_show();
    system("route");

    return (0);
}

// int main() {
//     // 创建套接字并绑定到任意接口
//     int sock = socket(AF_INET, SOCK_STREAM, 0);
//     struct sockaddr_in addr;
//     addr.sin_family = AF_INET;
//     addr.sin_addr.s_addr = htonl(INADDR_ANY);
//     addr.sin_port = htons(80); // 假设使用HTTP协议监听所有接口
//     if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
//         perror("bind failed");
//         exit(1);
//     }

//     // 获取网络接口信息
//     struct ifaddrs *ifaddr, *ifa;
//     getifaddrs(&ifaddr);

//     // 遍历接口并输出路由信息
//     for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
//         if (ifa->ifa_addr->sa_family == AF_INET) { // 检查是否为IPv4接口
//             struct sockaddr_in *addrp = (struct sockaddr_in *)ifa->ifa_addr;
//             char ip[INET_ADDRSTRLEN];
//             if (inet_ntop(AF_INET, &addrp->sin_addr, ip, sizeof(ip))) { // 将IP地址转换为字符串
//                 printf("Interface %s has IP address %s\n", ifa->ifa_name, ip);
//                 struct sockaddr_in gw;
//                 if (getnameinfo((struct sockaddr *)&ifa->ifa_dstaddr, ifa->ifa_dstaddr->sa_family == AF_INET ? sizeof(gw) : 0, NULL, 0, NULL, 0, NI_NUMERICHOST ) == 0) { // 获取网关地址并输出
//                     printf("Interface %s has route to %s\n", ifa->ifa_name, ifa->ifa_dstaddr->sa_family == AF_INET ? inet_ntoa(gw.sin_addr) : "any");
//                 } else {
//                     // printf("Failed to get route to %s\n", ifa->ifa_dstaddr->sa_family == AF_INET ? inet_ntoa(*(struct in_addr *)&ifa->ifa_dstaddr->sa_addr) : "any");
//                 }
//             }
//         }
//     }

//     // 释放接口信息结构体的内存
//     freeifaddrs(ifaddr); // 只需要调用一次freeifaddrs函数，因为它已经将所有接口信息释放了内
//     close(sock); // 关闭套接字，释放资源。在C语言中，我们通常在完成操作后关闭资源，以防止资源泄漏。这里我们
//     return 0; // 程序正常结束并返回0表示成功。如果在处理过程中发生错误或异常情况，需要返回一
// }
